package com.example;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author loubobooo
 * @Description # 13. 罗马数字转整数
 * @Date 2019/9/10
 */
public class RomanToInteger {

    /**
     * @return
     * @Author loubobooo
     * @Description 罗马数字包含以下七种字符:I，V，X，L，C，D和M。
     * <p>
     * 字符          数值
     * I             1
     * V             5
     * X             10
     * L             50
     * C             100
     * D             500
     * M             1000
     * 例如， 罗马数字 2 写做II，即为两个并列的 1。12 写做XII，即为X+II。 27 写做XXVII, 即为XX+V+II。
     * <p>
     * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做IIII，而是IV。数字 1 在数字 5 的左边，
     * 所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为IX。这个特殊的规则只适用于以下六种情况：
     * <p>
     * I可以放在V(5) 和X(10) 的左边，来表示 4 和 9。
     * X可以放在L(50) 和C(100) 的左边，来表示 40 和90。
     * C可以放在D(500) 和M(1000) 的左边，来表示400 和900。
     * 给定一个罗马数字，将其转换成整数。输入确保在 1到 3999 的范围内。
     * @Date 2019/9/10 14:39
     * @Param
     **/
    public int romanToInt(String s) {
        int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        Map<String, Integer> map = new HashMap<>(1 << 5);
        for (int i = 0, length = romans.length; i < length; i++) {
            map.put(romans[i], nums[i]);
        }
        // 回收内存空间，提升性能31s-->27s
        nums = null;
        romans = null;
        int sum = 0;
        // 排除s = null的可能
        if (s != null) {
            // 排除s = "" 和 s = "  "的可能
            s = s.trim();
            if (!s.isEmpty()) {
                for (int i = 0, length = s.length(); i < length; i++) {
                    // 针对两个字符串的罗马数字的处理
                    int j = i + 2 < length ? i + 2 : length;
                    String temp = s.substring(i, j);
                    if (map.containsKey(temp)) {
                        sum += map.get(temp);
                        // 跳过一位指针
                        i++;
                    } else {
                        temp = s.charAt(i) + "";
                        sum += map.get(temp);
                    }
                }
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        RomanToInteger romanToInteger = new RomanToInteger();
        int iv = romanToInteger.romanToInt("LVIII");
        System.out.println(iv);

        String s = "abcd";
        String substring = s.substring(0, 2);
        System.out.println(substring);
    }
}
